﻿Imports System.Reflection

Namespace Attribute

    ''' <summary>
    ''' DTOオブジェクトなどのキー項目に付与するカスタム属性。
    ''' </summary>
    ''' <version>1.0 [sonodar] 2011/07/24 新規作成</version>
    <AttributeUsage( _
            AttributeTargets.Field Or AttributeTargets.Property, _
            AllowMultiple:=False, Inherited:=False)> _
    Public Class KeyAttribute
        Inherits System.Attribute
        Implements IComparable(Of KeyAttribute)

        Private _order As Integer   '// キーの順序

        ''' <summary>
        ''' キーの順序を指定する。<br/>
        ''' この値はオブジェクトの比較などの順序として使用される。
        ''' </summary>
        Public Property Order() As Integer
            <System.Diagnostics.DebuggerStepThrough()> _
            Get
                Return Me._order
            End Get
            <System.Diagnostics.DebuggerStepThrough()> _
            Set(ByVal value As Integer)
                Me._order = value
            End Set
        End Property

        ''' <summary>
        ''' Objに設定されているキー項目をリストで返す。<br/>
        ''' キーが設定されていない場合はすべての項目のリストを返す。
        ''' </summary>
        ''' <returns>項目(プロパティまたはフィールド)のリスト</returns>
        Public Shared Function GetKeyMembers(ByVal Obj As Object) As IList(Of MemberInfo)
            Dim members As New List(Of MemberInfo)
            'FIXME 未実装 Sonodar.Common.KeyAttribute#GetKeyMembers(Object)
            Return members
        End Function

        ''' <summary>
        ''' Objに設定されているキー値をリストで返す。<br/>
        ''' キーが設定されていない場合は空のリストを返す。
        ''' </summary>
        ''' <returns>キー値のリスト</returns>
        Public Shared Function GetKeyValues(ByVal Obj As Object) As IList(Of Object)
            Dim values As New List(Of Object)
            'FIXME 未実装 Sonodar.Common.KeyAttribute#GetKeyValues(Object)
            Return values
        End Function

        ''' <summary>
        ''' Objに設定されているキー項目名と値をMapで返す。<br/>
        ''' キーが設定されていない場合はすべての項目名と値のMapを返す。
        ''' </summary>
        ''' <returns>項目名と値のMap</returns>
        Public Shared Function GetKeys(ByVal Obj As Object) As IDictionary(Of String, Object)

            Dim keys As New Dictionary(Of String, Object)   '// キー項目Map
            Dim all As New Dictionary(Of String, Object)    '// 全項目Map

            'FIXME 未実装 Sonodar.Common.KeyAttribute#GetKeys(Object)

            '// キー項目が存在する場合はキーMapを返す
            If keys.Count > 0 Then Return keys

            '// キー項目がなければすべての値
            Return all

        End Function

        ''' <summary>
        ''' Objに設定されているキー項目名をリストで返す。<br/>
        ''' キーが設定されていない場合はすべての項目名と値のMapを返す。
        ''' </summary>
        ''' <returns>項目名と値のMap</returns>
        Public Shared Function GetKeyNames(ByVal Obj As Object) As IList(Of String)
            Dim names As New List(Of String)
            'FIXME 未実装 Sonodar.Common.KeyAttribute#GetKeyNames(Object)
            Return names
        End Function

        ''' <summary>
        ''' キー属性の順序を比較する。
        ''' </summary>
        ''' <param name="other">比較するキー属性</param>
        ''' <returns>
        ''' キー属性の順序が同じなら0、<br/>
        ''' otherより大きければ正の値、otherより小さければ負の値
        ''' </returns>
        Public Function CompareTo(ByVal other As KeyAttribute) As Integer _
                        Implements IComparable(Of KeyAttribute).CompareTo
            Return Me.Order.CompareTo(other.Order)
        End Function

    End Class

End Namespace
